﻿// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"

/**mesh生命游戏中一个结点的数据*/
class GAMEOFLIFE_API FOneNodeBase
{

private:	
	//世界中的序号
	int index;
	//x位置
	uint16 pointX;
	//y位置
	uint16 pointY;
	//z位置
	uint16 pointZ;

	uint8 liftBuffer;
	//生命周期
	uint8 liftNow;

protected:


	//临近结点数量
	uint16 nearNodeNum;	

	//临近结点指针数组
	FOneNodeBase** nearNodePtrList;



	inline void SetNowLift(uint8 lift);

public:

	FOneNodeBase();


	~FOneNodeBase();
	/**初始化结点
	* @ param x			X位置
	* @ param y			Y位置
	* @ param z			Z位置
	* @ param i			世界中的序号
	* @ param n			相邻点数量
	* @ param nerbList	相邻点指针数组
	*/
	void Init(uint16 x, uint16 y, uint16 z, int i, uint16 n, FOneNodeBase** nerbList);

	void SetLift(uint8 l);

	inline uint8 GetLiftBuffer()const;

	inline uint8 GetLift()const;

	/**获得该结点序号*/
	inline int GetIndex()const;

	/**获得该结点位置*/
	inline FIntVector GetPoint()const;



public:


	/**更新该结点状态*/
	virtual int UpDataLift() = 0;


	/**更新该结点状态*/
	void SaveBuffer();

};

class GAMEOFLIFE_API FOneNode2D:public FOneNodeBase
{

public:
	/**更新该结点状态*/
	virtual int UpDataLift() override;

};

class GAMEOFLIFE_API FOneNode3D :public FOneNodeBase
{
public:
	static uint8 minKeep;
	static uint8 maxKeep;
	static uint8 maxNear;
public:
	/**更新该结点状态*/
	virtual int UpDataLift() override;

};


class GAMEOFLIFE_API FLiftWorld
{

private:
	/*世界X方向数量**/
	uint16 sizeX;
	/*世界Y方向数量**/
	uint16 sizeY;
	/*世界Z方向数量**/
	uint16 sizeZ;

	/**XY平面上的总数，方便计算用*/
	uint32 numXY;
	/**结点总数*/
	uint32 allnum;

	/**结点总数  长度为 allnum*/
	FOneNodeBase* allNode = nullptr;
	//边缘的伪结点  
	FOneNodeBase* edgeLifeNode = nullptr;

	/**世界迭代次数*/
	uint32 liveTime;


public:

	bool IsValid()const;

	FIntVector GetWorldSize()const;

	uint32  GetAllNode()const;

	uint32  GetLiveTime()const;

	/**获取指定位置的节点*/
	inline const FOneNodeBase* GetNodeC(int x, int y, int z)const;

	/**获取指定位置的节点*/
	inline const FOneNodeBase* GetNodeC(uint32 index)const;


	void SetLiftStart(TArray<int> start);

	void SetNodeLift(uint32 index, uint8 lift);

public:
	FLiftWorld();

	~FLiftWorld();

	/**初始化世界*/
	bool InitWorld(uint16 x, uint16 y, uint16 z);



	/**更新世界*/
	void UpDataWorld();

private:

	/**获取指定位置的节点*/
	inline FOneNodeBase* GetNode(int x, int y, int z);
	/**获取指定位置的节点*/
	inline FOneNodeBase* GetNode(uint32 index);

	/**获取位置对应的序号*/
	inline int GetIndex(uint16 x, uint16 y, uint16 z)const;

	/***/
	void InitOne(int x, int y, int z, uint32 i);


};